package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IGroupCompanyDAO;
import org.jsola.hr.dto.GroupCompanyAddDTO;
import org.jsola.hr.dto.GroupCompanyUpdateDTO;
import org.jsola.hr.entity.CompanyDO;
import org.jsola.hr.entity.GroupCompanyDO;
import org.jsola.hr.query.GroupCompanyQuery;
import org.jsola.hr.vo.CompanyVO;
import org.jsola.hr.vo.GroupCompanyListVO;
import org.jsola.hr.vo.GroupCompanyVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 子公司分管公司关系表
 *
 * @author zhr
 */
public interface IGroupCompanyService extends IService<IGroupCompanyDAO, GroupCompanyDO> {

    /**
     * 新增子公司分管公司关系表
     *
     * @param groupCompanyAddDTO 新增子公司分管公司关系表DTO
     * @param tokenUser          当前用户
     * @return 子公司分管公司关系表详情信息
     */
    GroupCompanyVO save(GroupCompanyAddDTO groupCompanyAddDTO, TokenUser tokenUser);

    /**
     * 批量新增子公司分管公司关系表
     *
     * @param groupCompanyAddDTOList 新增子公司分管公司关系表DTO
     * @param tokenUser              当前用户
     * @return 子公司分管公司关系表详情信息
     */
    List<GroupCompanyVO> batchSave(List<GroupCompanyAddDTO> groupCompanyAddDTOList, TokenUser tokenUser);

    /**
     * 修改子公司分管公司关系表
     *
     * @param groupCompanyUpdateDTO 修改子公司分管公司关系表DTO
     * @param tokenUser             当前用户
     * @return 更新数量
     */
    int update(GroupCompanyUpdateDTO groupCompanyUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除子公司分管公司关系表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser       当前用户
     * @param groupCompanyIds 子公司分管公司关系表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... groupCompanyIds);

    /**
     * 根据子公司分管公司关系表id查找
     *
     * @param groupCompanyId 子公司分管公司关系表id
     * @param siteId         所属站点id
     * @return 子公司分管公司关系表详情信息
     */
    GroupCompanyVO selectById(String groupCompanyId, String siteId);

    /**
     * 查询子公司分管公司关系表
     *
     * @param groupCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 子公司分管公司关系表列表信息
     */
    List<GroupCompanyListVO> select(GroupCompanyQuery groupCompanyQuery, String siteId);

    /**
     * 查询子公司分管公司关系表记录数
     *
     * @param groupCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 子公司分管公司关系表记录数
     */
    int selectCount(GroupCompanyQuery groupCompanyQuery, String siteId);

    /**
     * 分页查询子公司分管公司关系表
     *
     * @param groupCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 子公司分管公司关系表列表信息
     */
    Page<GroupCompanyListVO> selectPage(GroupCompanyQuery groupCompanyQuery, String siteId);


    /**
     * 根据子公司分管公司关系表id查找
     *
     * @param groupCompanyId 子公司分管公司关系表id
     * @param siteId         所属站点id
     * @return 子公司分管公司关系表
     */
    GroupCompanyDO selectDOById(String groupCompanyId, String siteId);

    /**
     * 查询子公司分管公司关系表
     *
     * @param groupCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 子公司分管公司关系表列表
     */
    List<GroupCompanyDO> selectDO(GroupCompanyQuery groupCompanyQuery, String siteId);

    /**
     * 获取某个组的分管公司 递归查询
     *
     * @param groupId 组id
     * @param siteId  站点
     * @return 某个组的分管公司
     */
    List<GroupCompanyDO> listByGroupId(String groupId, String siteId);

    /**
     * 获取某个组的分管公司 递归查询
     *
     * @param groupIds 组id
     * @param siteId   站点
     * @return 某个组的分管公司
     */
    List<GroupCompanyDO> selectByGroupIds(List<String> groupIds, String siteId);

    /**
     * 获取某个组的分管公司
     *
     * @param groupIds 组id
     * @param siteId   站点
     * @return 某个组的分管公司
     */
    List<String> selectCompanyIdsByGroupIds(List<String> groupIds, String siteId);

    /**
     * 获取租户下全部用工单位的分组
     *
     * @param groupIds 组id
     * @param siteId   站点
     * @return 某个组的分管公司
     */
    List<GroupCompanyDO> selectAllCompanyGroupByGroupIds(List<String> groupIds, String siteId);

    /**
     * 获取公司所在分组
     *
     * @param companyIds 用工单位Id
     * @param siteId     站点
     * @return 某个组的分管公司
     */
    List<GroupCompanyDO> selectByCompanyIds(List<String> companyIds, String siteId);

    /**
     * 获取公司所在分组数量
     *
     * @param companyIds 用工单位Id
     * @param siteId     站点
     * @return 数量
     */
    int selectCountByCompanyIds(List<String> companyIds, String siteId);

    /**
     * 删除某个子公司全部的分管公司
     *
     * @param groupId   组id
     * @param tokenUser 当前用户
     * @return 修改数量
     */
    int deleteByGroup(String groupId, TokenUser tokenUser);

    /**
     * 判断一个公司是不是子公司,如果是返回所属子公司id
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 所属子公司id, 没有就是null
     */
    List<String> checkCompanyIsChild(String companyId, String siteId);

    /**
     * 筛选拥有管理本用工单位权限的分公司
     *
     * @param groupList      分公司
     * @param childCompanyId 主公司id或分公司id,"supreme"代表总公司
     * @param siteId         站点id
     * @return 拥有管理本用工单位权限的分公司
     */
    List<String> listHasRoleInCompany(List<String> groupList, String childCompanyId, String siteId);

    /**
     * 判断分公司是否有分管用工单位的权限
     *
     * @param groupId        分公司
     * @param childCompanyId 主公司id或分公司id,"supreme"代表总公司
     * @param siteId         站点id
     * @return 拥有管理本用工单位权限的分公司
     */
    Boolean groupHasRoleInCompany(String groupId, String childCompanyId, String siteId);

    /**
     * 根据用工单位分组查询该用工单位分组下的所有用工单位的Id
     *
     * @param companyGroupId 用工单位分组Id
     * @param siteId         站点
     * @return 用工单位Id列表
     */
    List<String> selectCompanyIdListByGroupId(String companyGroupId, String siteId);

    /**
     * 根据用工单位分组查询该用工单位分组下的所有用工单位的Id
     *
     * @param childCompanyIds 用工单位分组Id
     * @param siteId          站点
     * @return 用工单位Id列表
     */
    List<String> selectCompanyIdListByGroupIds(List<String> childCompanyIds, String siteId);

    /**
     * 根据账单Id查询这个账单所在用工分组下的所有用工单位
     *
     * @param costBillId 账单Id
     * @param tokenUser  当前用户
     * @return 用工单位
     */
    List<CompanyDO> selectCompanyByCostBillId(Long costBillId, TokenUser tokenUser);

    /**
     * 查询分组下的用工单位集合（过滤登录人权限）
     * @param groupCompanyQuery
     * @param tokenUser
     * @return
     */
    Page<CompanyVO> companyListByGroupId(GroupCompanyQuery groupCompanyQuery, TokenUser tokenUser);
}


